package app.model;

import java.io.Serializable;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import app.controller.ChequeController;

public class Cheque implements Serializable {
	private static final long serialVersionUID = 1L;
	
	private GregorianCalendar dataInicial;
	private GregorianCalendar dataVencimento;
	private String nome;
	private String banco;
	private double valor;

	public Cheque(String nome, double valor, GregorianCalendar dataInicial,
			GregorianCalendar dataVencimento, String banco) {
		this.nome = nome;
		this.valor = valor;
		this.dataInicial = dataInicial;
		this.dataVencimento = dataVencimento;
		this.banco = banco;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public double getValor() {
		return valor;
	}

	public void setValor(double valor) {
		this.valor = valor;
	}

	public GregorianCalendar getDataInicial() {
		return dataInicial;
	}

	public void setDataInicial(GregorianCalendar dataInicial) {
		this.dataInicial = dataInicial;
	}

	public GregorianCalendar getDataVencimento() {
		return dataVencimento;
	}

	public void setDataVencimento(GregorianCalendar dataVencimento) {
		this.dataVencimento = dataVencimento;
	}

	public double calculaValorNoVencimento(GregorianCalendar dataInicial,
			GregorianCalendar dataFinal) {

		double jurosDiario = ChequeController.getInstance().getTaxaJuros() / 30;

		GregorianCalendar dataInicialReal = converteDataParaDiaUtil(dataInicial);
		
		GregorianCalendar dataFinalReal = converteDataParaDiaUtil(dataFinal);
		
		double diasDiff = diferencaDias(dataInicialReal, dataFinalReal);
		
		
		double valorFinal = valor - (valor * jurosDiario * diasDiff) / 100;
		
		return valorFinal < 0 ? 0 : valorFinal;
	}

	private int diferencaDias(GregorianCalendar dataInicial,
			GregorianCalendar dataFinal) {

		Date dInicial = dataInicial.getTime();

		Date dFinal = dataFinal.getTime();

		long diff = dFinal.getTime() - dInicial.getTime();

		return (int) (diff / (1000 * 60 * 60 * 24));
	}

	private GregorianCalendar converteDataParaDiaUtil(GregorianCalendar data) {

		GregorianCalendar novaData = (GregorianCalendar) data.clone();

		while (novaData.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY
				|| novaData.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
			novaData.add(Calendar.DAY_OF_YEAR, 1);
		}

		return novaData;
	}

	public double calculaValorNoVencimento() {
		return calculaValorNoVencimento(dataInicial, dataVencimento);
	}

	public String getDiffDias() {
		return String.valueOf(
				diferencaDias(converteDataParaDiaUtil(dataInicial),
						converteDataParaDiaUtil(dataVencimento)));
	}

	public String getBanco() {
		return banco;
	}
}
